package pogvue.util;


public class QuickSort {

  public static void sort(float[] arr,Object[] s) {
    sort(arr,0,arr.length-1,s);
  }
  public static void sort(int[] arr,Object[] s) {
    sort(arr,0,arr.length-1,s);
  }

  public static void sort(String[] arr,Object[] s) {
    stringSort(arr,0,arr.length-1,s);
  }

  private static void stringSort(String[] arr,int p, int r,Object[] s) {
    int q;

    if (p < r) {
      q = stringPartition(arr,p,r,s);
      stringSort(arr,p,q,s);
      stringSort(arr,q+1,r,s);
    }
  }

  public static void sort(float[] arr,int p, int r,Object[] s) {
    int q;

    if (p < r) {
      q = partition(arr,p,r,s);
      sort(arr,p,q,s);
      sort(arr,q+1,r,s);
    }
  }
  private static void sort(int[] arr,int p, int r,Object[] s) {
    int q;

    if (p < r) {
      q = partition(arr,p,r,s);
      sort(arr,p,q,s);
      sort(arr,q+1,r,s);
    }
  }

  private static int partition(float[] arr, int p, int r,Object[] s) {
    float x = arr[p];
    int i = p-1;
    int j = r+1;

    while(true) {
      do {
        j = j-1;
      }	while (arr[j] > x);

      do {
        i = i+1;
      } while (arr[i] < x);

      if ( i < j) {
        float tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;

        Object tmp2 = s[i];
        s[i] = s[j];
        s[j] = tmp2;
      } else {
        return j;
      }
    }
  }
  private static int partition(int[] arr, int p, int r,Object[] s) {
    int x = arr[p];
    int i = p-1;
    int j = r+1;

    while(true) {
      do {
        j = j-1;
      }	while (arr[j] > x);

      do {
        i = i+1;
      } while (arr[i] < x);

      if ( i < j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;

        Object tmp2 = s[i];
        s[i] = s[j];
        s[j] = tmp2;
      } else {
        return j;
      }
    }
  }
  private static int stringPartition(String[] arr, int p, int r,Object[] s) {
    String x = arr[p];
    int i = p-1;
    int j = r+1;

    while(true) {
      do {
        j = j-1;
      }	while (arr[j].compareTo(x) < 0);

      do {
        i = i+1;
      } while (arr[i].compareTo(x) > 0);

      if ( i < j) {
        String tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;

        Object tmp2 = s[i];
        s[i] = s[j];
        s[j] = tmp2;
      } else {
        return j;
      }
    }
  }
}



